﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using FinanSoft.Entities;

namespace WebService
{
    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "IServiceContract" in both code and config file together.
    [ServiceContract]
    public interface IServiceContract
    {
        /// <summary>
        /// Método que se encarga de llamar al sistema para poder autenticar al
        /// cliente que está ingresando en el sistema
        /// </summary>
        /// <param name="username">Nombre de usuario del cliente</param>
        /// <param name="password">Contraseña del cliente</param>
        /// <returns>Retorna la cuenta auxiliar asociada a ese cliente (como información)</returns>
        [OperationContract]
        AuxiliarAccount LogIn(String username, String password, String company);

        /// <summary>
        /// Método que se encarga de llamar al sistema para poder autenticar al
        /// vendedor que está ingresando al sistema
        /// </summary>
        /// <param name="username">Nombre de usuario del vendedor</param>
        /// <param name="password">Contraseña del vendedor</param>
        /// <returns>Indica si la persona se logró autenticar exitosamente</returns>
        [OperationContract]
        bool LogInSalesman(String username, String password, String company);

        /// <summary>
        /// Método que se encarga de obtener las monedas disponibles en el sistema
        /// </summary>
        /// <returns>Retorna la lista de Monedas</returns>
        [OperationContract]
        List<Currency> GetCurrencies();

        /// <summary>
        /// Método que se encarga de obtener las bodegas registradas en el sistema
        /// </summary>
        /// <returns>Retorna la lista de objetos bodega</returns>
        [OperationContract]
        List<StoreRoom> GetStoreRooms();

        /// <summary>
        /// Método que se encarga de obtener todos los artículos que hay en el sistema
        /// además de su información: bodega en donde está, el stock disponible, etc...
        /// </summary>
        /// <returns></returns>
        [OperationContract]
        List<Item> GetItems();

        /// <summary>
        /// Método que se encaga de obtener el impuesto por defecto para un artículo
        /// </summary>
        /// <returns>Retorna un objeto Impuesto con su respectiva información</returns>
        [OperationContract]
        Tax GetDefaultTax();

        /// <summary>
        /// Obtiene los reportes de venta orientados a cliente-artículo
        /// </summary>
        /// <param name="auxId">Id de la cuenta auxiliar del cliente</param>
        /// <param name="itemId">Id del artículo</param>
        /// <returns>Información de reporte, uno por cada cliente y artículo. Si algún artículo nunca ha sido comprado por un cliente
        /// en específico, no se incluye el reporte de cliente-artículo para este caso particular.</returns>
        [OperationContract]
        FinanSoft.Entities.SaleReport[] GetSaleReport(int auxId, int itemId);

        /// <summary>
        /// Obtiene las cuentas auxiliares de todos los clientes
        /// </summary>
        /// <returns></returns>
        [OperationContract]
        FinanSoft.Entities.AuxiliarAccount[] GetClients();

        /// <summary>
        /// Método que se encaga de revisar si hubo error o no
        /// </summary>
        /// <returns>Retorna un booleano de si hubo error o no</returns>
        [OperationContract]
        bool IsError();

        /// <summary>
        /// Método que se encaga de obtener el mensaje de error
        /// </summary>
        /// <returns>Retorna el mensaje de error</returns>
        [OperationContract]
        String GetErrorMessage();

        /// <summary>
        /// Método que se encarga de guardar el pedido del cliente como una orden de venta de la empresa
        /// </summary>
        /// <param name="idAuxiliarAccount">Id de la cuenta auxiliar asociada al cliente que realiza el pedido</param>
        /// <param name="postingDate">Fecha de emisión del pedido</param>
        /// <param name="deliveryExpDate">Fecha de vencimiento dl pedido</param>
        /// <param name="idMoneda">Moneda en que se hizo el pedido</param>
        /// <param name="amountBeforeTax">Monto antes de impuesto</param>
        /// <param name="taxAmount">Monto de impuestos</param>
        /// <param name="totalAmount">Monto después de impuesto</param>
        /// <param name="details">Lista de artículos que van en el documento</param>
        /// <returns>Retorna si la operación tuvo éxito o no</returns>
        [OperationContract]
        bool SaveOrderDocument(int idAuxiliarAccount, DateTime postingDate, DateTime deliveryExpDate, int idMoneda, double amountBeforeTax, double taxAmount, double totalAmount, List<FinanSoft.Entities.DocDetail> details);
    }
}
